package main

import "strings"

func lengthOfLongestSubstring(s string) int {
	var preChar byte     // 前一个字符
	var subString string // 前一个子串
	var ssArr []string   // 前一个子串组成的数组
	slen := len(s)       // s的长度
	for i := 0; i < slen; i++ {
		chr := s[i]        // 当前字符
		str := string(chr) // 当前字符的字符串形式
		if chr == preChar {
			ssArr = append(ssArr, subString)
			subString = str
		} else {
			if strings.Contains(subString, str) { // 检查当前字符在前一个字串中是否已存在
				ssArr = append(ssArr, subString) // 先保存前一个子串
				if len(subString) > 1 {          // 前一个子串不止当前字符这一个时
					idx := strings.Index(subString, str) + 1 // 获取当前字符在前一个子串中下一个字符的索引
					newString := subString[idx:] + str       // 截掉前一个子串中从当前字符的下一个字符开始的剩余部分与当前字符组成新的子串
					ssArr = append(ssArr, subString[:idx])   // 将前一个子串中包含当前字符的前一部分拎出来单独先存入数组
					subString = newString                    // 用新的子串更新前一个子串
				} else {
					subString = str
				}
			} else {
				subString += str
			}
		}
		preChar = chr // 更新前一个字符
		if i+1 == slen {
			ssArr = append(ssArr, subString)
		}
	}

	maxlen := 0
	for _, v := range ssArr {
		if len(v) > maxlen {
			maxlen = len(v)
		}
	}
	return maxlen
}
